package com.fowo.api.documentCirculation.model;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fowo.api.documentCirculation.entity.DataTaskMapping;
import com.fowo.api.documentCirculation.model.constant.DataTaskMappingTypes;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;

import java.util.List;

/**
 * 提供 {@link DataTaskMapping#getTypeValue()} ()} 内 JSON 表示的对象类型
 * @author yl_ls
 */
@Getter
@Setter
@Accessors(chain = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class MappingTypeValue {
    /**
     * 常量值, 在 {@link DataTaskMapping#getType()} 等于 {@link DataTaskMappingTypes#VALUE} 有效
     */
    private String constantValue;

    /**
     * 定制 JOIN 子句, 在 {@link DataTaskMapping#getType()} 等于 {@link DataTaskMappingTypes#VALUE} 有效
     */
    private String joinSql;

    /**
     * 定制查询字段, 在 {@link DataTaskMapping#getType()} 等于 {@link DataTaskMappingTypes#VALUE} 有效
     */
    private String selectSql;

    /**
     * 列名, 在 {@link DataTaskMapping#getType()} 等于 {@link DataTaskMappingTypes#FIELD} 有效
     */
    private String columnName;

    /**
     * 表达式, 在 {@link DataTaskMapping#getType()} 等于 {@link DataTaskMappingTypes#FORMULA} 有效
     */
    private String expression;

    /**
     * 输入框类型，在 在 {@link DataTaskMapping#getType()} 等于 {@link DataTaskMappingTypes#INPUT_BOX} 有效
     * 可用值为 text(默认), int, long, decimal, date, datetime
     */
    private String inputType;

    /**
     * 是否必填, 在 {@link DataTaskMapping#getType()} 等于 {@link DataTaskMappingTypes#INPUT_BOX} 或 {@link DataTaskMappingTypes#SELECT_BOX} 有效
     */
    private Boolean required;

    /**
     * 选项类型, 在 {@link DataTaskMapping#getType()} 等于 {@link DataTaskMappingTypes#SELECT_BOX} 有效
     * <ul>
     *     <li>options: 表示使用 {@link #options} 定义的选项列表</li>
     *     <li>dict: 表示使用 {@link #optionDictCode} 定义的选项字典</li>
     *     <li>sql: 表示使用 {@link #optionSql} 定义的选项查询</li>
     * </ul>
     */
    private String optionType;

    /**
     * 选项集, 在 {@link DataTaskMapping#getType()} 等于 {@link DataTaskMappingTypes#SELECT_BOX} 有效
     */
    private List<MappingDataOption> options;

    /**
     * 选项使用的系统字典代码, 在 {@link DataTaskMapping#getType()} 等于 {@link DataTaskMappingTypes#SELECT_BOX} 有效
     */
    private String optionDictCode;

    /**
     * 选项使用的 SQL 语句, 在 {@link DataTaskMapping#getType()} 等于 {@link DataTaskMappingTypes#SELECT_BOX} 有效
     * <p>此 SQL 需要至少返回 value, label 两列构成选项列表</p>
     * <p>可选的 selected 列返回是否默认选中</p>
     */
    private String optionSql;

    /**
     * 默认值，在 {@link DataTaskMapping#getType()} 等于 {@link DataTaskMappingTypes#INPUT_BOX} 或 {@link DataTaskMappingTypes#SELECT_BOX} 有效
     */
    private String defaultValue;
    /**
     * 文件类型，在 {@link DataTaskMapping#getType()} 等于 {@link DataTaskMappingTypes#FILE_BOX} 有效
     * <p>
     * 可用值：image, word, pdf, wordOrPdf, excel, any
     * </p>
     */
    private String fileType;
    /**
     * 最多文件数，默认为 1，在 {@link DataTaskMapping#getType()} 等于 {@link DataTaskMappingTypes#FILE_BOX} 有效
     */
    private Integer maxItems;
    /**
     * 最大文件大小，单位为 KB, 默认为 200，在 {@link DataTaskMapping#getType()} 等于 {@link DataTaskMappingTypes#FILE_BOX} 有效
     */
    private Integer maxSize;
}
